• R generation

https://rss.onlinelibrary.wiley.com/doi/10.1111/j.1740-9713.2018.01169.x

2 R zor şeyler için kolay, kolay şeyler için zor

R Syntax Comparison::CHEAT SHEET

https://www.amelia.mn/Syntax-cheatsheet.pdf


3 R paketleri

3.1 Neden paketler var



https://blog.mitchelloharawild.com/blog/user-2018-feature-wall/



3.3 Kendi paket evrenini oluştur


3.4 R için yardım bulma

  • Vignette


https://stackoverflow.com/

  • Google uygun anahtar kelime



http://cran.r-project.org/doc/contrib/Baggott-refcard-v2.pdf

https://www.rstudio.com/resources/cheatsheets/

  • Awesome R

https://github.com/qinwf/awesome-R#readme

https://awesome-r.com/

  • Twitter

https://twitter.com/hashtag/rstats?src=hash

  • Reproducible Examples

3.5 R paket yükleme

install.packages("tidyverse", dependencies = TRUE)
install.packages("jmv", dependencies = TRUE)
install.packages("questionr", dependencies = TRUE)
install.packages("Rcmdr", dependencies = TRUE)
install.packages("summarytools")

5 RStudio ile veri yükleme

https://support.rstudio.com/hc/en-us/articles/218611977-Importing-Data-with-RStudio


5.1 Excel

5.2 SPSS

5.3 csv


6 Veriyi görüntüleme

View(data)
data
head
tail
glimpse
str
skimr::skim()

7 Veriyi değiştirme

7.1 Veriyi kod ile değiştirelim

7.2 Veriyi eklentilerle değiştirme


7.3 RStudio aracılığıyla recode

questionr paketi kullanılacak


https://juba.github.io/questionr/articles/recoding_addins.html




8 Basit tanımlayıcı istatistikler

summary()
mean
median
min
max
sd
table()
Parsed with column specification:
cols(
  Sepal.Length = col_double(),
  Sepal.Width = col_double(),
  Petal.Length = col_double(),
  Petal.Width = col_double(),
  Species = col_character()
)

 DESCRIPTIVES

 Descriptives                                          
 ───────────────────────────────────────────────────── 
                          Species       Sepal.Length   
 ───────────────────────────────────────────────────── 
   N                      setosa                  50   
                          versicolor              50   
                          virginica               50   
   Missing                setosa                   0   
                          versicolor               0   
                          virginica                0   
   Mean                   setosa                5.01   
                          versicolor            5.94   
                          virginica             6.59   
   Std. error mean        setosa              0.0498   
                          versicolor          0.0730   
                          virginica           0.0899   
   Median                 setosa                5.00   
                          versicolor            5.90   
                          virginica             6.50   
   Mode                   setosa                5.00   
                          versicolor            5.50   
                          virginica             6.30   
   Sum                    setosa                 250   
                          versicolor             297   
                          virginica              329   
   Standard deviation     setosa               0.352   
                          versicolor           0.516   
                          virginica            0.636   
   Variance               setosa               0.124   
                          versicolor           0.266   
                          virginica            0.404   
   Range                  setosa                1.50   
                          versicolor            2.10   
                          virginica             3.00   
   Minimum                setosa                4.30   
                          versicolor            4.90   
                          virginica             4.90   
   Maximum                setosa                5.80   
                          versicolor            7.00   
                          virginica             7.90   
   Skewness               setosa               0.120   
                          versicolor           0.105   
                          virginica            0.118   
   Std. error skewness    setosa               0.337   
                          versicolor           0.337   
                          virginica            0.337   
   Kurtosis               setosa              -0.253   
                          versicolor          -0.533   
                          virginica           0.0329   
   Std. error kurtosis    setosa               0.662   
                          versicolor           0.662   
                          virginica            0.662   
   25th percentile        setosa                4.80   
                          versicolor            5.60   
                          virginica             6.23   
   50th percentile        setosa                5.00   
                          versicolor            5.90   
                          virginica             6.50   
   75th percentile        setosa                5.20   
                          versicolor            6.30   
                          virginica             6.90   
 ───────────────────────────────────────────────────── 


8.1 summarytools

https://cran.r-project.org/web/packages/summarytools/vignettes/Introduction.html

8.1.1 Frequencies

Variable: iris$Species
Type: Factor (unordered)

  Freq % Valid % Valid Cum. % Total % Total Cum.
setosa 50 33.33 33.33 33.33 33.33
versicolor 50 33.33 66.67 33.33 66.67
virginica 50 33.33 100.00 33.33 100.00
<NA> 0 0.00 100.00
Total 150 100.00 100.00 100.00 100.00
  Freq % % Cum.
setosa 50 33.33 33.33
versicolor 50 33.33 66.67
virginica 50 33.33 100.00
Total 150 100.00 100.00

Cross-Tabulation / Row Proportions

Variables: smoker * diseased
Data Frame: tobacco
diseased
smoker Yes No Total
Yes 125 (41.95%) 173 (58.05%)  298 (100.00%)
No  99 (14.10%) 603 (85.90%)  702 (100.00%)
Total 224 (22.40%) 776 (77.60%) 1000 (100.00%)

Generated by summarytools 0.8.8 (R version 3.5.1)
2019-01-01

diseased
smoker Yes No
Yes 125 173
No 99 603

Generated by summarytools 0.8.8 (R version 3.5.1)
2019-01-01

Non-numerical variable(s) ignored: Species ### Descriptive Statistics
Data Frame: iris
N: 150

  Sepal.Length Sepal.Width Petal.Length Petal.Width
Mean 5.84 3.06 3.76 1.20
Std.Dev 0.83 0.44 1.77 0.76
Min 4.30 2.00 1.00 0.10
Q1 5.10 2.80 1.60 0.30
Median 5.80 3.00 4.35 1.30
Q3 6.40 3.30 5.10 1.80
Max 7.90 4.40 6.90 2.50
MAD 1.04 0.44 1.85 1.04
IQR 1.30 0.50 3.50 1.50
CV 0.14 0.14 0.47 0.64
Skewness 0.31 0.31 -0.27 -0.10
SE.Skewness 0.20 0.20 0.20 0.20
Kurtosis -0.61 0.14 -1.42 -1.36
N.Valid 150.00 150.00 150.00 150.00
Pct.Valid 100.00 100.00 100.00 100.00

Non-numerical variable(s) ignored: Species

  Mean Std.Dev Min Median Max
Sepal.Length 5.84 0.83 4.30 5.80 7.90
Sepal.Width 3.06 0.44 2.00 3.00 4.40
Petal.Length 3.76 1.77 1.00 4.35 6.90
Petal.Width 1.20 0.76 0.10 1.30 2.50

8.1.2 Data Frame Summary

tobacco
N: 1000

No Variable Stats / Values Freqs (% of Valid) Text Graph Valid Missing
1 gender
[factor]
1. F
2. M
489 (50.0%)
489 (50.0%)
IIIIIIIIIIIIIIII
IIIIIIIIIIIIIIII
978
(97.8%)
22
(2.2%)
2 age
[numeric]
mean (sd) : 49.6 (18.29)
min < med < max :
18 < 50 < 80
IQR (CV) : 32 (0.37)
63 distinct values 975
(97.5%)
25
(2.5%)
3 age.gr
[factor]
1. 18-34
2. 35-50
3. 51-70
4. 71 +
258 (26.5%)
241 (24.7%)
317 (32.5%)
159 (16.3%)
IIIIIIIIIIIII
IIIIIIIIIIII
IIIIIIIIIIIIIIII
IIIIIIII
975
(97.5%)
25
(2.5%)
4 BMI
[numeric]
mean (sd) : 25.73 (4.49)
min < med < max :
8.83 < 25.62 < 39.44
IQR (CV) : 5.72 (0.17)
974 distinct values 974
(97.4%)
26
(2.6%)
5 smoker
[factor]
1. Yes
2. No
298 (29.8%)
702 (70.2%)
IIIIII
IIIIIIIIIIIIIIII
1000
(100%)
0
(0%)
6 cigs.per.day
[numeric]
mean (sd) : 6.78 (11.88)
min < med < max :
0 < 0 < 40
IQR (CV) : 11 (1.75)
37 distinct values 965
(96.5%)
35
(3.5%)
7 diseased
[factor]
1. Yes
2. No
224 (22.4%)
776 (77.6%)
IIII
IIIIIIIIIIIIIIII
1000
(100%)
0
(0%)
8 disease
[character]
1. Hypertension
2. Cancer
3. Cholesterol
4. Heart
5. Pulmonary
6. Musculoskeletal
7. Diabetes
8. Hearing
9. Digestive
10. Hypotension
[ 3 others ]
36 (16.2%)
34 (15.3%)
21 ( 9.5%)
20 ( 9.0%)
20 ( 9.0%)
19 ( 8.6%)
14 ( 6.3%)
14 ( 6.3%)
12 ( 5.4%)
11 ( 5.0%)
21 ( 9.5%)
IIIIIIIIIIIIIIII
IIIIIIIIIIIIIII
IIIIIIIII
IIIIIIII
IIIIIIII
IIIIIIII
IIIIII
IIIIII
IIIII
IIII
IIIIIIIII
222
(22.2%)
778
(77.8%)
9 samp.wgts
[numeric]
mean (sd) : 1 (0.08)
min < med < max :
0.86 < 1.04 < 1.06
IQR (CV) : 0.19 (0.08)
0.86!: 267 (26.7%)
1.04!: 249 (24.9%)
1.05!: 324 (32.4%)
1.06!: 160 (16.0%)
! rounded
IIIIIIIIIIIII
IIIIIIIIIIII
IIIIIIIIIIIIIIII
IIIIIII

1000
(100%)
0
(0%)

8.1.3 Descriptive Statistics

Data Frame: iris
Group: Species = setosa
N: 50

  Mean Std.Dev Min Median Max
Sepal.Length 5.01 0.35 4.30 5.00 5.80
Sepal.Width 3.43 0.38 2.30 3.40 4.40
Petal.Length 1.46 0.17 1.00 1.50 1.90
Petal.Width 0.25 0.11 0.10 0.20 0.60

Group: Species = versicolor
N: 50

  Mean Std.Dev Min Median Max
Sepal.Length 5.94 0.52 4.90 5.90 7.00
Sepal.Width 2.77 0.31 2.00 2.80 3.40
Petal.Length 4.26 0.47 3.00 4.35 5.10
Petal.Width 1.33 0.20 1.00 1.30 1.80

Group: Species = virginica
N: 50

  Mean Std.Dev Min Median Max
Sepal.Length 6.59 0.64 4.90 6.50 7.90
Sepal.Width 2.97 0.32 2.20 3.00 3.80
Petal.Length 5.55 0.55 4.50 5.55 6.90
Petal.Width 2.03 0.27 1.40 2.00 2.50

Output file written: /var/folders/76/rq_s_23s7fd5r8hqrbg8rmnc0000gp/T//Rtmpm1NGZD/file6847650f974f.html

Group: Species = versicolor
N: 50
Mean Std.Dev Min Median Max
Sepal.Length 5.94 0.52 4.90 5.90 7.00
Sepal.Width 2.77 0.31 2.00 2.80 3.40
Petal.Length 4.26 0.47 3.00 4.35 5.10
Petal.Width 1.33 0.20 1.00 1.30 1.80
Group: Species = virginica
N: 50
Mean Std.Dev Min Median Max
Sepal.Length 6.59 0.64 4.90 6.50 7.90
Sepal.Width 2.97 0.32 2.20 3.00 3.80
Petal.Length 5.55 0.55 4.50 5.55 6.90
Petal.Width 2.03 0.27 1.40 2.00 2.50

Generated by summarytools 0.8.8 (R version 3.5.1)
2019-01-01

Output file appended: /var/folders/76/rq_s_23s7fd5r8hqrbg8rmnc0000gp/T//Rtmpm1NGZD/file6847650f974f.html


8.1.4 Descriptive Statistics

Variable: tobacco$BMI by age.gr

  18-34 35-50 51-70 71 +
Mean 23.84 25.11 26.91 27.45
Std.Dev 4.23 4.34 4.26 4.37
Min 8.83 10.35 9.01 16.36
Median 24.04 25.11 26.77 27.52
Max 34.84 39.44 39.21 38.37

  Mean Std.Dev Min Median Max
18-34 23.84 4.23 8.83 24.04 34.84
35-50 25.11 4.34 10.35 25.11 39.44
51-70 26.91 4.26 9.01 26.77 39.21
71 + 27.45 4.37 16.36 27.52 38.37


function ‘is’ appears not to be S3 generic; found functions that look like S3 methods‘>=’ not meaningful for factors$properties

$attributes.lengths names class row.names 5 1 150

$extensive.is [1] “is.data.frame” “is.list”
[3] “is.object” “is.recursive” [5] “is.unsorted”


### Frequencies   
**Variable:** tobacco$gender     
**Type:** Factor (unordered)   

|     &nbsp; | Freq | % Valid | % Valid Cum. | % Total | % Total Cum. |
|-----------:|-----:|--------:|-------------:|--------:|-------------:|
|      **F** |  489 |   50.00 |        50.00 |   48.90 |        48.90 |
|      **M** |  489 |   50.00 |       100.00 |   48.90 |        97.80 |
| **\<NA\>** |   22 |         |              |    2.20 |       100.00 |
|  **Total** | 1000 |  100.00 |       100.00 |  100.00 |       100.00 |

Frequencies

Variable: gender
Type: Factor (unordered)
Valid Total
gender Freq % % Cumul % % Cumul
F 489 50.00 50.00 48.90 48.90
M 489 50.00 100.00 48.90 97.80
<NA> 22 2.20 100.00
Total 1000 100.00 100.00 100.00 100.00

Generated by summarytools 0.8.8 (R version 3.5.1)
2019-01-01


8.2 skimr

library(skimr)
skim(df)

8.3 DataExplorer

library(DataExplorer)
DataExplorer::create_report(df)


8.4 Grafikler


### Cross-Tabulation / Row Proportions   
**Variables:** gender * smoker     
**Data Frame:** tobacco   
   
|        |        |              |              |                |
|-------:|-------:|-------------:|-------------:|---------------:|
|        | smoker |          Yes |           No |          Total |
| gender |        |              |              |                |
|      F |        | 147 (30.06%) | 342 (69.94%) |  489 (100.00%) |
|      M |        | 143 (29.24%) | 346 (70.76%) |  489 (100.00%) |
| \<NA\> |        |   8 (36.36%) |  14 (63.64%) |   22 (100.00%) |
|  Total |        | 298 (29.80%) | 702 (70.20%) | 1000 (100.00%) |

Cross-Tabulation / Row Proportions

Variables: gender * smoker
Data Frame: tobacco
smoker
gender Yes No Total
F 147 (30.06%) 342 (69.94%)  489 (100.00%)
M 143 (29.24%) 346 (70.76%)  489 (100.00%)
<NA>   8 (36.36%)  14 (63.64%)   22 (100.00%)
Total 298 (29.80%) 702 (70.20%) 1000 (100.00%)

Generated by summarytools 0.8.8 (R version 3.5.1)
2019-01-01

descr(tobacco, style = 'rmarkdown')

print(descr(tobacco), method = 'render', table.classes = 'st-small')

dfSummary(tobacco, style = 'grid', plain.ascii = FALSE)

print(dfSummary(tobacco, graph.magnif = 0.75), method = 'render')



9 Rcmdr

library(Rcmdr)

Rcmdr::Commander()
  • A Comparative Review of the R Commander GUI for R

http://r4stats.com/articles/software-reviews/r-commander/


11 Sonraki Konular

  • RStudio ile GitHub
  • Hipotez testleri
  • R Markdown ve R Notebook ile tekrarlanabilir rapor

12 Diğer kodlar


13 Geri Bildirim




  1. Bu bir derlemedir, mümkün mertebe alıntılara referans vermeye çalıştım.

LS0tCnRpdGxlOiBSIGlsZSBhbmFsaXplIGJhxZ9sYXJrZW5eW0J1IGJpciBkZXJsZW1lZGlyLCBtw7xta8O8biBtZXJ0ZWJlIGFsxLFudMSxbGFyYSByZWZlcmFucwogIHZlcm1leWUgw6dhbMSxxZ90xLFtLl0KYXV0aG9yOiAiRGVybGV5ZW4gW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLykiCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSlgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGhpZ2hsaWdodDoga2F0ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzUnCiAgaHRtbF9kb2N1bWVudDogCiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBrZWVwX21kOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCi0tLQoKPCEtLSBPcGVuIGFsbCBsaW5rcyBpbiBuZXcgdGFiLS0+ICAKPGJhc2UgdGFyZ2V0PSJfYmxhbmsiLz4gICAKCgo8IS0tIEdvIHRvIHd3dy5hZGR0aGlzLmNvbS9kYXNoYm9hcmQgdG8gY3VzdG9taXplIHlvdXIgdG9vbHMgLS0+IDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii8vczcuYWRkdGhpcy5jb20vanMvMzAwL2FkZHRoaXNfd2lkZ2V0LmpzI3B1YmlkPXJhLTViYzM2OTAwYTQwNTA5MGIiPiAgCjwvc2NyaXB0PiAKCgoKClshW10oaHR0cDovL3Jlcy5jbG91ZGluYXJ5LmNvbS9keWQ5MTFrbWgvaW1hZ2UvdXBsb2FkL2ZfYXV0byxxX2F1dG86YmVzdC92MTUzMDExMzA3Ny9JbWFnZV8yX3ZmeTQ4Yi5wbmcpXShodHRwczovL3d3dy5kYXRhY2FtcC5jb20vY29tbXVuaXR5L3R1dG9yaWFscy9kYXRhLXNjaWVuY2UtcGl0ZmFsbHMpCgoKLSBSIGdlbmVyYXRpb24KCmh0dHBzOi8vcnNzLm9ubGluZWxpYnJhcnkud2lsZXkuY29tL2RvaS8xMC4xMTExL2ouMTc0MC05NzEzLjIwMTguMDExNjkueAoKCiMgUiB5w7xrbGVtZQoKaHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVhjQkxFVmtucXZZCgpbIVtXaGF0IGlzIFI/XShodHRwOi8vaW1nLnlvdXR1YmUuY29tL3ZpL1hjQkxFVmtucXZZLzAuanBnKV0oaHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVhjQkxFVmtucXZZKQoKCiMjIFItcHJvamVjdAoKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvCgotLS0KClshW10oaHR0cHM6Ly9pc21heWMuZ2l0aHViLmlvL3RhbGtzL25lc3MtaW5mZXIvaW1nL2VuZ2luZS5wbmcpXShodHRwczovL2lzbWF5Yy5naXRodWIuaW8vdGFsa3MvbmVzcy1pbmZlci9zbGlkZV9kZWNrLmh0bWwjNikKCi0tLQoKIyMgUlN0dWRpbwoKaHR0cHM6Ly93d3cucnN0dWRpby5jb20vCgpodHRwczovL3d3dy5yc3R1ZGlvLmNvbS9wcm9kdWN0cy9yc3R1ZGlvL2Rvd25sb2FkLwoKaHR0cHM6Ly9tb2Rlcm5kaXZlLmNvbS8yLWdldHRpbmctc3RhcnRlZC5odG1sCgotLS0KClshW10oaHR0cDovL3d3dy11c2Vycy55b3JrLmFjLnVrL35lcjEzL1JTdHVkaW8lMjBBbmF0b215LnN2ZyldKGh0dHBzOi8vYnV6enJiZWVsaW5lLmJsb2cvMjAxOC8wNy8wNC9yc3R1ZGlvLWFuYXRvbXkvKQoKCgotLS0KCiMjIyBSU3R1ZGlvIGVrbGVudGlsZXJpCgotIERpc2NvdmVyIGFuZCBpbnN0YWxsIHVzZWZ1bCBSU3R1ZGlvIGFkZGlucwoKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2FkZGluc2xpc3QvUkVBRE1FLmh0bWwKCmh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vcnN0dWRpb2FkZGlucy8KCgpgYGB7cn0KIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoInJzdHVkaW8vYWRkaW5leGFtcGxlcyIsIHR5cGUgPSAic291cmNlIikKYGBgCgoKLS0tCgojIyBYMTEKCmh0dHBzOi8vd3d3LnhxdWFydHoub3JnLwoKLS0tCgojIyBKYXZhIE9TCgpodHRwczovL3N1cHBvcnQuYXBwbGUuY29tL2tiL2RsMTU3MgoKLS0tCgoKIyBSIHpvciDFn2V5bGVyIGnDp2luIGtvbGF5LCBrb2xheSDFn2V5bGVyIGnDp2luIHpvcgoKCi0gW1IgbWFrZXMgZWFzeSB0aGluZ3MgaGFyZCwgYW5kIGhhcmQgdGhpbmdzIGVhc3ldKGh0dHA6Ly9yNHN0YXRzLmNvbS9hcnRpY2xlcy93aHktci1pcy1oYXJkLXRvLWxlYXJuLykKCgotIEF5bsSxIMWfZXlpIMOnb2sgZmF6bGEgxZ9la2lsZGUgeWFwbWFrIG3DvG1rw7xuCgpSIFN5bnRheCBDb21wYXJpc29uOjpDSEVBVCBTSEVFVAoKaHR0cHM6Ly93d3cuYW1lbGlhLm1uL1N5bnRheC1jaGVhdHNoZWV0LnBkZgoKCgotLS0KCgojIFIgcGFrZXRsZXJpCgoKIyMgTmVkZW4gcGFrZXRsZXIgdmFyCgpbIVtdKGh0dHBzOi8vaXNtYXljLmdpdGh1Yi5pby90YWxrcy9uZXNzLWluZmVyL2ltZy9hcHBzdG9yZS5wbmcpXShodHRwczovL2lzbWF5Yy5naXRodWIuaW8vdGFsa3MvbmVzcy1pbmZlci9zbGlkZV9kZWNrLmh0bWwjNykKCi0tLQoKPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkkgbG92ZSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT4gY29tbXVuaXR5Ljxicj5Tb21lb25lIGlzIGxpa2UsICZxdW90O29oIGhleSBwZWVwcywgSSBzYXcgYSBiaWcgbmVlZCBmb3IgdGhpcyBtdW5kYW5lIGJ1dCBkaWZmaWN1bHQgdGFzayB0aGF0IEkgaW5mcmVxdWVudGx5IGRvLCBzbyBJIGNyZWF0ZWQgYSBwYWNrYWdlIHRoYXQgd2lsbCBsaXRlcmFsbHkgc2NyYXBlIHRoZSBsYXN0IGJpdHMgb2YgcGVhbnV0IGJ1dHRlciBvdXQgb2YgdGhlIGphciBmb3IgeW91LiBJdCYjMzk7cyBjYWxsZWQgcGJwbHlyLiZxdW90Ozxicj5XaGF0IGEgdHJpYmUuPC9wPiZtZGFzaDsgRnJhbmsgRWxhdnNreSDhtLDhtYPhtZfhtYMg4bWC4bam4ba74bWDyrPhtYggKEBGcmFua2x5X0RhdGEpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vRnJhbmtseV9EYXRhL3N0YXR1cy8xMDE0MTg5MDk1Mjk0MjkxOTY4P3JlZl9zcmM9dHdzcmMlNUV0ZnciPkp1bHkgMywgMjAxODwvYT48L2Jsb2NrcXVvdGU+CgotLS0KCgoKaHR0cHM6Ly9ibG9nLm1pdGNoZWxsb2hhcmF3aWxkLmNvbS9ibG9nL3VzZXItMjAxOC1mZWF0dXJlLXdhbGwvCgotLS0KCiFbXShodHRwczovL2Jsb2cubWl0Y2hlbGxvaGFyYXdpbGQuY29tL2Jsb2cvMjAxOC0wNy0xMS11c2VyLTIwMTgtZmVhdHVyZS13YWxsX2ZpbGVzL2ZpbmFsLmpwZykKCi0tLQoKIyMgUGFrZXRsZXJpIG5lcmVkZW4gYnVsYWJpbGlyaXoKCi0gQXZhaWxhYmxlIENSQU4gUGFja2FnZXMgQnkgTmFtZSAgCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9hdmFpbGFibGVfcGFja2FnZXNfYnlfbmFtZS5odG1sCgotIENSQU4gVGFzayBWaWV3cyAgCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi92aWV3cy8KCi0gQmlvY29uZHVjdG9yICAKaHR0cHM6Ly93d3cuYmlvY29uZHVjdG9yLm9yZwoKLSBSZWNvbW1lbmRSICAKaHR0cDovL3JlY29tbWVuZHIuaW5mby8KCi0gcGtnc2VhcmNoICAKQ1JBTiBwYWNrYWdlIHNlYXJjaCAgCmh0dHBzOi8vZ2l0aHViLmNvbS9tZXRhY3Jhbi9wa2dzZWFyY2gKCi0gQ1JBTnNlYXJjaGVyICAKaHR0cHM6Ly9naXRodWIuY29tL1Job0luYy9DUkFOc2VhcmNoZXIgIAoKLSBBd2Vzb21lIFIgIApodHRwczovL2F3ZXNvbWUtci5jb20vICAKCgojIyBLZW5kaSBwYWtldCBldnJlbmluaSBvbHXFn3R1cgoKLSBwa2d2ZXJzZTogQnVpbGQgYSBNZXRhLVBhY2thZ2UgVW5pdmVyc2UgIApodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvcGtndmVyc2UvaW5kZXguaHRtbAoKCgotLS0KCiMjIFIgacOnaW4geWFyZMSxbSBidWxtYQoKCmBgYHtyIHlhcmTEsW19CiMgP21lYW4KIyA/P2VmZXRjaAojIGhlbHAobWVyZ2UpCiMgZXhhbXBsZShtZXJnZSkKYGBgCgoKCi0gVmlnbmV0dGUKCiFbXShmaWd1cmVzL3ZpZ25ldHRlLnBuZykKCi0tLQoKLSBSRG9jdW1lbnRhdGlvbgpodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcKCi0gUiBQYWNrYWdlIERvY3VtZW50YXRpb24KaHR0cHM6Ly9yZHJyLmlvLwoKLSBHaXRIdWIKCi0gU3RhY2tvdmVyZmxvdwoKaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS8KCi0gR29vZ2xlIHV5Z3VuIGFuYWh0YXIga2VsaW1lCgoKCjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD48YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCIgZGF0YS1sYW5nPSJlbiI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5Ib3cgSSB1c2UgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT4gPGJyPmgvdCA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL1RoZVByYWN0aWNhbERldj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AVGhlUHJhY3RpY2FsRGV2PC9hPiA8YSBocmVmPSJodHRwczovL3QuY28vZXJSblRHMFVqciI+cGljLnR3aXR0ZXIuY29tL2VyUm5URzBVanI8L2E+PC9wPiZtZGFzaDsgRW1pbHkgQm92ZWUgKEBlYm92ZWUwOSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9lYm92ZWUwOS9zdGF0dXMvMTAyODAzNzU5NDk0NzQ4NTY5Nj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5BdWd1c3QgMTAsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPgoKCi0tLQoKCiFbXShmaWd1cmVzL0dvb2dsZS1wYWNrYWdlLW5hbWUucG5nKQoKLS0tCgoKCiFbXShmaWd1cmVzL0dvb2dsZS1zdGFydC13aXRoLVIucG5nKQoKLS0tCgotIEF3ZXNvbWUgQ2hlYXRzaGVldApodHRwczovL2dpdGh1Yi5jb20vZGV0YWlseWFuZy9hd2Vzb21lLWNoZWF0c2hlZXQKCmh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmcvZG9jL2NvbnRyaWIvQmFnZ290dC1yZWZjYXJkLXYyLnBkZgoKaHR0cHM6Ly93d3cucnN0dWRpby5jb20vcmVzb3VyY2VzL2NoZWF0c2hlZXRzLwoKCi0gQXdlc29tZSBSCgpodHRwczovL2dpdGh1Yi5jb20vcWlud2YvYXdlc29tZS1SI3JlYWRtZQoKaHR0cHM6Ly9hd2Vzb21lLXIuY29tLwoKCgoKLSBUd2l0dGVyCgpodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoCgoKLSBSZXByb2R1Y2libGUgRXhhbXBsZXMgIAoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+R290IGEgcXVlc3Rpb24gdG8gYXNrIG9uIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vU2xhY2tIUT9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AU2xhY2tIUTwvYT4gb3IgcG9zdCBvbiA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2dpdGh1Yj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AZ2l0aHViPC9hPj8gTm8gdGltZSB0byByZWFkIHRoZSBsb25nIHBvc3Qgb24gaG93IHRvIHVzZSByZXByZXg/IEhlcmUgaXMgYSAyMC1zZWNvbmQgZ2lmIGZvciB5b3UgdG8gZm9ybWF0IHlvdXIgUiBjb2RlcyBuaWNlbHkgYW5kIGZvciBvdGhlcnMgdG8gcmVwcm9kdWNlIHlvdXIgcHJvYmxlbS4gKEFuIGV4YW1wbGUgZnJvbSBhIHRhbGsgZ2l2ZW4gYnkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9KZW5ueUJyeWFuP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkBKZW5ueUJyeWFuPC9hPikgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0P3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXQ8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9ncHVHWHBGSXNYIj5waWMudHdpdHRlci5jb20vZ3B1R1hwRklzWDwvYT48L3A+Jm1kYXNoOyBaaGlZYW5nIChAemhpaWl5YW5nKSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL3poaWlpeWFuZy9zdGF0dXMvMTA1MzAwNjAwMzcxMTU2OTkyMD9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5PY3RvYmVyIDE4LCAyMDE4PC9hPjwvYmxvY2txdW90ZT48c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CgoKLSBLZWVwaW5nIHVwIHRvIGRhdGUgd2l0aCBSIG5ld3MgIApodHRwczovL21hc2FsbW9uLmV1LzIwMTkvMDEvMjUvdXB0b2RhdGUvICAKCgoKLS0tCgojIyBSIHBha2V0IHnDvGtsZW1lCgpgYGAKaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKaW5zdGFsbC5wYWNrYWdlcygiam12IiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKaW5zdGFsbC5wYWNrYWdlcygicXVlc3Rpb25yIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKaW5zdGFsbC5wYWNrYWdlcygiUmNtZHIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQppbnN0YWxsLnBhY2thZ2VzKCJzdW1tYXJ5dG9vbHMiKQpgYGAKCmBgYHtyIHBha2V0IHnDvGtsZW1lfQojIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiMgaW5zdGFsbC5wYWNrYWdlcygiam12IiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJxdWVzdGlvbnIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQojIGluc3RhbGwucGFja2FnZXMoIlJjbWRyIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJzdW1tYXJ5dG9vbHMiKQpgYGAKCgpgYGB7ciBwYWtldCBjYWdpcm1hLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGV2YWwgPSBUUlVFLCBpbmNsdWRlID0gVFJVRX0KIyByZXF1aXJlKHRpZHl2ZXJzZSkKIyByZXF1aXJlKGptdikKIyByZXF1aXJlKHF1ZXN0aW9ucikKIyBsaWJyYXJ5KHN1bW1hcnl0b29scykKIyBsaWJyYXJ5KGdnYW5pbWF0ZSkKYGBgCgotLS0KCiMgUiBzdHVkaW8gaWxlIHByb2plIG9sdcWfdHVybWEKCmh0dHBzOi8vc3VwcG9ydC5yc3R1ZGlvLmNvbS9oYy9lbi11cy9hcnRpY2xlcy8yMDA1MjYyMDctVXNpbmctUHJvamVjdHMKCiFbXShodHRwOi8vd3d3LnJzdHVkaW8uY29tL2ltYWdlcy9kb2NzL3Byb2plY3RzX25ldy5wbmcpCgotLS0KCiMgUlN0dWRpbyBpbGUgdmVyaSB5w7xrbGVtZQoKaHR0cHM6Ly9zdXBwb3J0LnJzdHVkaW8uY29tL2hjL2VuLXVzL2FydGljbGVzLzIxODYxMTk3Ny1JbXBvcnRpbmctRGF0YS13aXRoLVJTdHVkaW8KCiFbXShodHRwczovL3N1cHBvcnQucnN0dWRpby5jb20vaGMvZW4tdXMvYXJ0aWNsZV9hdHRhY2htZW50cy8yMDYyNzc2MTgvZGF0YS1pbXBvcnQtb3ZlcnZpZXcuZ2lmKQoKLS0tCgojIyBFeGNlbAoKIyMgU1BTUwoKIyMgY3N2CgoKLS0tCgojIFZlcml5aSBnw7Zyw7xudMO8bGVtZQoKPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPlNwcmVhZHNoZWV0IHVzZXJzIHVzaW5nIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdHM8L2E+OiAgd2hlcmUmIzM5O3MgdGhlIGRhdGE/PGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT4gdXNlcnMgdXNpbmcgc3ByZWFkc2hlZXRzOiAgd2hlcmUmIzM5O3MgdGhlIGNvZGU/PC9wPiZtZGFzaDsgTGVvbmFyZCBLaWVmZXIgKEBsZW5raWVmZXIpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vbGVua2llZmVyL3N0YXR1cy8xMDE1NTg3NDc1NTgwOTU2NjcyP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkp1bHkgNywgMjAxODwvYT48L2Jsb2NrcXVvdGU+CgoKCmBgYHtyLCByZXN1bHRzPSJtYXJrdXAifQojIGxpYnJhcnkobnljZmxpZ2h0czEzKQojIHN1bW1hcnkoZmxpZ2h0cykKYGBgCgoKCmBgYApWaWV3KGRhdGEpCmBgYAoKCmBgYApkYXRhCmBgYAoKCmBgYApoZWFkCmBgYAoKCmBgYAp0YWlsCmBgYAoKCmBgYApnbGltcHNlCmBgYAoKCmBgYApzdHIKYGBgCgoKYGBgCnNraW1yOjpza2ltKCkKYGBgCgotLS0KCgojIFZlcml5aSBkZcSfacWfdGlybWUKCiMjIFZlcml5aSBrb2QgaWxlIGRlxJ9pxZ90aXJlbGltCgojIyBWZXJpeWkgZWtsZW50aWxlcmxlIGRlxJ9pxZ90aXJtZQoKIVtdKGZpZ3VyZXMvY2hhbmdlX2RhdGEucG5nKQoKCi0tLQoKCiMjIFJTdHVkaW8gYXJhY8SxbMSxxJ/EsXlsYSByZWNvZGUKCipxdWVzdGlvbnIqIHBha2V0aSBrdWxsYW7EsWxhY2FrCgohW10oZmlndXJlcy9sZXZlbF9yZWNvZGUucG5nKQoKCi0tLQoKCgpodHRwczovL2p1YmEuZ2l0aHViLmlvL3F1ZXN0aW9uci9hcnRpY2xlcy9yZWNvZGluZ19hZGRpbnMuaHRtbAoKCiFbXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vanViYS9xdWVzdGlvbnIvbWFzdGVyL3Jlc291cmNlcy9zY3JlZW5zaG90cy9pcmVjXzEucG5nKQoKCi0tLQoKIVtdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qdWJhL3F1ZXN0aW9uci9tYXN0ZXIvcmVzb3VyY2VzL3NjcmVlbnNob3RzL2lyZWNfMi5wbmcpCgoKLS0tCgohW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2p1YmEvcXVlc3Rpb25yL21hc3Rlci9yZXNvdXJjZXMvc2NyZWVuc2hvdHMvaXJlY18zLnBuZykKCgotLS0KCiMgQmFzaXQgdGFuxLFtbGF5xLFjxLEgaXN0YXRpc3Rpa2xlcgoKYGBgCnN1bW1hcnkoKQpgYGAKCmBgYAptZWFuCmBgYAoKYGBgCm1lZGlhbgpgYGAKCmBgYAptaW4KYGBgCgpgYGAKbWF4CmBgYAoKYGBgCnNkCmBgYAoKYGBgCnRhYmxlKCkKYGBgCgoKYGBge3IgZGVzY3JpcHRpdmUsIGVjaG89VFJVRSwgaW5jbHVkZSA9IFRSVUV9CmxpYnJhcnkocmVhZHIpCmlyaXNkYXRhIDwtIHJlYWRfY3N2KCJkYXRhL2lyaXMuY3N2IikKCmptdjo6ZGVzY3JpcHRpdmVzKAogICAgZGF0YSA9IGlyaXNkYXRhLAogICAgdmFycyA9ICJTZXBhbC5MZW5ndGgiLAogICAgc3BsaXRCeSA9ICJTcGVjaWVzIiwKICAgIGZyZXEgPSBUUlVFLAogICAgaGlzdCA9IFRSVUUsCiAgICBkZW5zID0gVFJVRSwKICAgIGJhciA9IFRSVUUsCiAgICBib3ggPSBUUlVFLAogICAgdmlvbGluID0gVFJVRSwKICAgIGRvdCA9IFRSVUUsCiAgICBtb2RlID0gVFJVRSwKICAgIHN1bSA9IFRSVUUsCiAgICBzZCA9IFRSVUUsCiAgICB2YXJpYW5jZSA9IFRSVUUsCiAgICByYW5nZSA9IFRSVUUsCiAgICBzZSA9IFRSVUUsCiAgICBza2V3ID0gVFJVRSwKICAgIGt1cnQgPSBUUlVFLAogICAgcXVhcnQgPSBUUlVFLAogICAgcGNFcUdyID0gVFJVRSkKYGBgCgotLS0KCmBgYHtyIHNjYXR0ZXIsIGVjaG89VFJVRSwgaW5jbHVkZT1UUlVFfQojIGluc3RhbGwucGFja2FnZXMoInNjYXRyIikKCnNjYXRyOjpzY2F0KAogICAgZGF0YSA9IGlyaXNkYXRhLAogICAgeCA9ICJTZXBhbC5MZW5ndGgiLAogICAgeSA9ICJTZXBhbC5XaWR0aCIsCiAgICBncm91cCA9ICJTcGVjaWVzIiwKICAgIG1hcmcgPSAiZGVucyIsCiAgICBsaW5lID0gImxpbmVhciIsCiAgICBzZSA9IFRSVUUpCgpgYGAKCiMjIHN1bW1hcnl0b29scwoKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3N1bW1hcnl0b29scy92aWduZXR0ZXMvSW50cm9kdWN0aW9uLmh0bWwKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmxpYnJhcnkoc3VtbWFyeXRvb2xzKQpzdW1tYXJ5dG9vbHM6OmZyZXEoaXJpcyRTcGVjaWVzLCBzdHlsZSA9ICJybWFya2Rvd24iKQpgYGAKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CnN1bW1hcnl0b29sczo6ZnJlcShpcmlzJFNwZWNpZXMsIHJlcG9ydC5uYXMgPSBGQUxTRSwgc3R5bGUgPSAicm1hcmtkb3duIiwgb21pdC5oZWFkaW5ncyA9IFRSVUUpCmBgYAoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30Kd2l0aCh0b2JhY2NvLCBwcmludChjdGFibGUoc21va2VyLCBkaXNlYXNlZCksIG1ldGhvZCA9ICdyZW5kZXInKSkKYGBgCgoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30Kd2l0aCh0b2JhY2NvLCAKICAgICBwcmludChjdGFibGUoc21va2VyLCBkaXNlYXNlZCwgcHJvcCA9ICduJywgdG90YWxzID0gRkFMU0UpLCAKICAgICAgICAgICBvbWl0LmhlYWRpbmdzID0gVFJVRSwgbWV0aG9kID0gInJlbmRlciIpKQpgYGAKCgoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30Kc3VtbWFyeXRvb2xzOjpkZXNjcihpcmlzLCBzdHlsZSA9ICJybWFya2Rvd24iKQpgYGAKCgoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KZGVzY3IoaXJpcywgc3RhdHMgPSBjKCJtZWFuIiwgInNkIiwgIm1pbiIsICJtZWQiLCAibWF4IiksIHRyYW5zcG9zZSA9IFRSVUUsIAogICAgICBvbWl0LmhlYWRpbmdzID0gVFJVRSwgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgoKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CiMgdmlldyhkZlN1bW1hcnkoaXJpcykpCgpgYGAKCgohW10oZmlndXJlcy9kZnN1bW1hcnkucG5nKQoKCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpkZlN1bW1hcnkodG9iYWNjbywgcGxhaW4uYXNjaWkgPSBGQUxTRSwgc3R5bGUgPSAiZ3JpZCIpCmBgYAoKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CgojIEZpcnN0IHNhdmUgdGhlIHJlc3VsdHMKCmlyaXNfc3RhdHNfYnlfc3BlY2llcyA8LSBieShkYXRhID0gaXJpcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRJQ0VTID0gaXJpcyRTcGVjaWVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZVTiA9IGRlc2NyLCBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1lZCIsICJtYXgiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3Bvc2UgPSBUUlVFKQoKIyBUaGVuIHVzZSB2aWV3KCksIGxpa2Ugc286Cgp2aWV3KGlyaXNfc3RhdHNfYnlfc3BlY2llcywgbWV0aG9kID0gInBhbmRlciIsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KIyB2aWV3KGlyaXNfc3RhdHNfYnlfc3BlY2llcykKYGBgCgohW10oZmlndXJlcy9EZXNjcmlwdGl2ZVN0YXRpc3RpY3MucG5nKQoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpkYXRhKHRvYmFjY28pICMgdG9iYWNjbyBpcyBhbiBleGFtcGxlIGRhdGFmcmFtZSBpbmNsdWRlZCBpbiB0aGUgcGFja2FnZQpCTUlfYnlfYWdlIDwtIHdpdGgodG9iYWNjbywgCiAgICAgICAgICAgICAgICAgICBieShCTUksIGFnZS5nciwgZGVzY3IsIAogICAgICAgICAgICAgICAgICAgICAgc3RhdHMgPSBjKCJtZWFuIiwgInNkIiwgIm1pbiIsICJtZWQiLCAibWF4IikpKQp2aWV3KEJNSV9ieV9hZ2UsICJwYW5kZXIiLCBzdHlsZSA9ICJybWFya2Rvd24iKQpgYGAKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KQk1JX2J5X2FnZSA8LSB3aXRoKHRvYmFjY28sIAogICAgICAgICAgICAgICAgICAgYnkoQk1JLCBhZ2UuZ3IsIGRlc2NyLCAgdHJhbnNwb3NlID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRzID0gYygibWVhbiIsICJzZCIsICJtaW4iLCAibWVkIiwgIm1heCIpKSkKCnZpZXcoQk1JX2J5X2FnZSwgInBhbmRlciIsIHN0eWxlID0gInJtYXJrZG93biIsIG9taXQuaGVhZGluZ3MgPSBUUlVFKQpgYGAKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KdG9iYWNjb19zdWJzZXQgPC0gdG9iYWNjb1sgLGMoImdlbmRlciIsICJhZ2UuZ3IiLCAic21va2VyIildCmZyZXFfdGFibGVzIDwtIGxhcHBseSh0b2JhY2NvX3N1YnNldCwgZnJlcSkKCiMgdmlldyhmcmVxX3RhYmxlcywgZm9vdG5vdGUgPSBOQSwgZmlsZSA9ICdmcmVxLXRhYmxlcy5odG1sJykKYGBgCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CndoYXQuaXMoaXJpcykKYGBgCgotLS0KCmBgYHtyfQpmcmVxKHRvYmFjY28kZ2VuZGVyLCBzdHlsZSA9ICdybWFya2Rvd24nKQpgYGAKCi0tLQoKYGBge3J9CnByaW50KGZyZXEodG9iYWNjbyRnZW5kZXIpLCBtZXRob2QgPSAncmVuZGVyJykKYGBgCgotLS0KCiMjIHNraW1yCgpgYGAKbGlicmFyeShza2ltcikKc2tpbShkZikKYGBgCgotLS0KCiMjIERhdGFFeHBsb3JlcgoKYGBgCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQpEYXRhRXhwbG9yZXI6OmNyZWF0ZV9yZXBvcnQoZGYpCmBgYAoKClshW10oaHR0cHM6Ly9zdGF0aWMxLnNxdWFyZXNwYWNlLmNvbS9zdGF0aWMvNThlZWY4ODQ2YTQ5NjNlNDI5Njg3YTRkL3QvNWJkZmMyZmI0ZDdhOWMwNGVlNTBiN2FhLzE1NDEzOTExNjA3MDIvZGF0YUV4cGxvcmVyR2lmTGcuZ2lmP2Zvcm1hdD0xNTAwdyldKGh0dHBzOi8vd3d3LmxpdHRsZW1pc3NkYXRhLmNvbS9ibG9nL3NpbXBsZS1lZGEpCgoKCi0tLQoKIyMgR3JhZmlrbGVyCgpgYGB7cn0KIyBsaWJyYXJ5KGdncGxvdDIpCiMgbGlicmFyeShtb3NhaWMpCiMgbVBsb3QoaXJpc2RhdGEpCmBgYAoKLS0tCgpgYGB7cn0KY3RhYmxlKHRvYmFjY28kZ2VuZGVyLCB0b2JhY2NvJHNtb2tlciwgc3R5bGUgPSAncm1hcmtkb3duJykKYGBgCgotLS0KCmBgYHtyfQpwcmludChjdGFibGUodG9iYWNjbyRnZW5kZXIsIHRvYmFjY28kc21va2VyKSwgbWV0aG9kID0gJ3JlbmRlcicpCmBgYAoKYGBgCmRlc2NyKHRvYmFjY28sIHN0eWxlID0gJ3JtYXJrZG93bicpCgpwcmludChkZXNjcih0b2JhY2NvKSwgbWV0aG9kID0gJ3JlbmRlcicsIHRhYmxlLmNsYXNzZXMgPSAnc3Qtc21hbGwnKQoKZGZTdW1tYXJ5KHRvYmFjY28sIHN0eWxlID0gJ2dyaWQnLCBwbGFpbi5hc2NpaSA9IEZBTFNFKQoKcHJpbnQoZGZTdW1tYXJ5KHRvYmFjY28sIGdyYXBoLm1hZ25pZiA9IDAuNzUpLCBtZXRob2QgPSAncmVuZGVyJykKYGBgCgoKLS0tCgoKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkhlcmUsIGJ1aWxkaW5nIHVwIGEgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL2dncGxvdDI/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNnZ3Bsb3QyPC9hPiBhcyBzbG93bHkgYXMgcG9zc2libGUsIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdHM8L2E+LiAgSW5jcmVtZW50YWwgYWRqdXN0bWVudHMuICA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzdGVhY2hpbmdpZGVhcz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0c3RlYWNoaW5naWRlYXM8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9uVXVsUWw4YlBoIj5waWMudHdpdHRlci5jb20vblV1bFFsOGJQaDwvYT48L3A+Jm1kYXNoOyBHaW5hIFJleW5vbGRzIChARXZhTWFlUmV5KSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL0V2YU1hZVJleS9zdGF0dXMvMTAyOTEwNDY1Njc2MzU3MjIyNj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5BdWd1c3QgMTMsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KCgotLS0KCgpbIVtdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kcmVhbVJzL2VzcXVpc3NlL21hc3Rlci9tYW4vZmlndXJlcy9lc3F1aXNzZS5naWYpXShodHRwczovL2dpdGh1Yi5jb20vZHJlYW1Scy9lc3F1aXNzZSkKCgo8YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCIgZGF0YS1sYW5nPSJlbiI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5EcmVhbWluZyBvZiBhIGZhbmN5IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9Sc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNSc3RhdHM8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9nZ3Bsb3Q/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNnZ3Bsb3Q8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9kYXRhdml6P3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jZGF0YXZpejwvYT4gYnV0IHN0aWxsIHNjYXJlZCBvZiB0eXBpbmcgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL2NvZGU/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNjb2RlPC9hPj8gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9fcHZpY3RvcnI/cmVmX3NyYz10d3NyYyU1RXRmdyI+QF9wdmljdG9ycjwvYT4gZXNxdWlzc2UgcGFja2FnZSBoYXMgeW91IGNvdmVyZWQgPGEgaHJlZj0iaHR0cHM6Ly90LmNvLzF2SURYY1ZBQUYiPmh0dHBzOi8vdC5jby8xdklEWGNWQUFGPC9hPiA8YSBocmVmPSJodHRwczovL3QuY28vUmxUa3B0bnJOdiI+cGljLnR3aXR0ZXIuY29tL1JsVGtwdG5yTnY8L2E+PC9wPiZtZGFzaDsgUmFkb3NsYXcgUGFuY3phayAoQFJQYW5jemFrKSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL1JQYW5jemFrL3N0YXR1cy8xMDQ3MDE5NTg4NjU4MDQwODMyP3JlZl9zcmM9dHdzcmMlNUV0ZnciPk9jdG9iZXIgMiwgMjAxODwvYT48L2Jsb2NrcXVvdGU+CjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KCgoKCgoKCgoKCi0tLQoKIyBSY21kcgoKYGBgCmxpYnJhcnkoUmNtZHIpCgpSY21kcjo6Q29tbWFuZGVyKCkKCmBgYAoKCi0gQSBDb21wYXJhdGl2ZSBSZXZpZXcgb2YgdGhlIFIgQ29tbWFuZGVyIEdVSSBmb3IgUgoKaHR0cDovL3I0c3RhdHMuY29tL2FydGljbGVzL3NvZnR3YXJlLXJldmlld3Mvci1jb21tYW5kZXIvCgoKLS0tCgojIGphbW92aQoKaHR0cHM6Ly93d3cuamFtb3ZpLm9yZy8KCiFbIVtdKGh0dHBzOi8vd3d3LmphbW92aS5vcmcvYXNzZXRzL21haW4tc2NyZWVuc2hvdC5wbmcpXShodHRwczovL3d3dy5qYW1vdmkub3JnLykKCgpodHRwczovL2Jsb2cuamFtb3ZpLm9yZy8yMDE4LzA3LzMwL3JqLmh0bWwKCiFbIVtdKGh0dHBzOi8vYmxvZy5qYW1vdmkub3JnL2Fzc2V0cy9pbWFnZXMvcmoucG5nKV0oaHR0cHM6Ly9ibG9nLmphbW92aS5vcmcvMjAxOC8wNy8zMC9yai5odG1sKQoKLS0tCgojIFNvbnJha2kgS29udWxhcgoKLSBSU3R1ZGlvIGlsZSBHaXRIdWIKLSBIaXBvdGV6IHRlc3RsZXJpCi0gUiBNYXJrZG93biB2ZSBSIE5vdGVib29rIGlsZSB0ZWtyYXJsYW5hYmlsaXIgcmFwb3IKCgotLS0KCiMgRGnEn2VyIGtvZGxhcgoKLSBEacSfZXIga29kbGFyIGnDp2luIGJha8SxbsSxejogW2h0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby9dKGh0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby8pCgoKLS0tCgojIEdlcmkgQmlsZGlyaW0KCi0gR2VyaSBiaWxkaXJpbSBpw6dpbiB0xLFrbGF5xLFuxLF6OiBfW0dlcmkgYmlsZGlyaW0gZm9ybXVdKGh0dHBzOi8vZ29vLmdsL2Zvcm1zL1lqR1o1REhndFBsUjFSbkIzKV8KCgotLS0KCjxzY3JpcHQgaWQ9ImRzcS1jb3VudC1zY3IiIHNyYz0iLy9odHRwcy1zYmFsY2ktZ2l0aHViLWlvLmRpc3F1cy5jb20vY291bnQuanMiIGFzeW5jPjwvc2NyaXB0PgoKPGRpdiBpZD0iZGlzcXVzX3RocmVhZCI+PC9kaXY+CjxzY3JpcHQ+CgovKioKKiAgUkVDT01NRU5ERUQgQ09ORklHVVJBVElPTiBWQVJJQUJMRVM6IEVESVQgQU5EIFVOQ09NTUVOVCBUSEUgU0VDVElPTiBCRUxPVyBUTyBJTlNFUlQgRFlOQU1JQyBWQUxVRVMgRlJPTSBZT1VSIFBMQVRGT1JNIE9SIENNUy4KKiAgTEVBUk4gV0hZIERFRklOSU5HIFRIRVNFIFZBUklBQkxFUyBJUyBJTVBPUlRBTlQ6IGh0dHBzOi8vZGlzcXVzLmNvbS9hZG1pbi91bml2ZXJzYWxjb2RlLyNjb25maWd1cmF0aW9uLXZhcmlhYmxlcyovCi8qCnZhciBkaXNxdXNfY29uZmlnID0gZnVuY3Rpb24gKCkgewp0aGlzLnBhZ2UudXJsID0gUEFHRV9VUkw7ICAvLyBSZXBsYWNlIFBBR0VfVVJMIHdpdGggeW91ciBwYWdlJ3MgY2Fub25pY2FsIFVSTCB2YXJpYWJsZQp0aGlzLnBhZ2UuaWRlbnRpZmllciA9IFBBR0VfSURFTlRJRklFUjsgLy8gUmVwbGFjZSBQQUdFX0lERU5USUZJRVIgd2l0aCB5b3VyIHBhZ2UncyB1bmlxdWUgaWRlbnRpZmllciB2YXJpYWJsZQp9OwoqLwooZnVuY3Rpb24oKSB7IC8vIERPTidUIEVESVQgQkVMT1cgVEhJUyBMSU5FCnZhciBkID0gZG9jdW1lbnQsIHMgPSBkLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwpzLnNyYyA9ICdodHRwczovL2h0dHBzLXNiYWxjaS1naXRodWItaW8uZGlzcXVzLmNvbS9lbWJlZC5qcyc7CnMuc2V0QXR0cmlidXRlKCdkYXRhLXRpbWVzdGFtcCcsICtuZXcgRGF0ZSgpKTsKKGQuaGVhZCB8fCBkLmJvZHkpLmFwcGVuZENoaWxkKHMpOwp9KSgpOwo8L3NjcmlwdD4KPG5vc2NyaXB0PlBsZWFzZSBlbmFibGUgSmF2YVNjcmlwdCB0byB2aWV3IHRoZSA8YSBocmVmPSJodHRwczovL2Rpc3F1cy5jb20vP3JlZl9ub3NjcmlwdCI+Y29tbWVudHMgcG93ZXJlZCBieSBEaXNxdXMuPC9hPjwvbm9zY3JpcHQ+CgotLS0KCgo=